/**
 * Created by xjchen on 2024-05-09.
 * */

#ifndef MIDDLEWARE_TIMERREADER_H
#define MIDDLEWARE_TIMERREADER_H

#include "DeviceReader.h"
#include <time.h>

class TimerLocal;

class TimerReader : public DeviceReader {

public:
    ~TimerReader();

    TimerReader();

    /**
     * 创建定时器，周期性触发onRead()，如果下游连接TaskModule，则直接驱动
     * 
     * @param delay 延迟时间
     * @param interval 定时间隔
     */
    FLOW_API void setTimer(timespec delay, timespec interval);

    /**
     * 定时触发的操作必须由子类继承onRead()完成
     * 
     * @param buffer 如果下游没有驱动，则为空指针
     * @param len buffer长度
     */
    virtual int64_t onRead(char *buffer, int64_t len) override = 0;

    /*
     *  获取到下次触发的剩余时间
     */
    USER_API timespec getRemainedTime();

    /*
     * 如果触发时，onRead()仍在执行中，则忽略该触发事件，getIgnoredCount()可以获取
     * 自上次触发后被忽略的触发次数
     */
    USER_API int getIgnoredCount();

    void start() override;

    void stop() override;

    TimerLocal *local;

private:
    friend class TimerLocal;
};


#endif //MIDDLEWARE_TIMERREADER_H
